// Test case for Issue 103

import java.util.ArrayList;
import java.util.List;

class CC {}

class HR {}

// Crazy: remove the "extends HR" and it compiles
public class Bug103 extends HR {

  // Crazy: add a 23th element as for example "hello" and it compiles
  // Crazy: replace IG.C with IG.C+"" and it compiles
  // Crazy: remove final and it compiles
  // Crazy: replace with new String[22] and it compiles
  // Crazy: reduce to less than 5 distinct values and it compiles (replace IG.D with IG.C)
  final String[] ids = {
    IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C, IG.C,
    IG.C, IG.C, IG.D, IG.E, IG.F, IG.G
  };

  // Crazy: remove arg u and it compiles
  // Crazy: remove any line of m1 and it compiles
  // Crazy: replace two o args by null and it compiles
  void m1(CC o, Object u) {
    String cc = m2(o);
    String dd = m2(o);
  }

  String m2(final CC c) {
    return "a";
  }

  // Crazy: remove ids.length and it compiles
  // replace return type List with ArrayList and it compiles
  List<CC> m3(CC c) {
    ArrayList<CC> lc = new ArrayList<>(ids.length);
    return lc;
  }

  // Crazy: comment out the whole unused LV class and it compiles
  // Crazy: comment one of the following 4 lines out and it compiles
  static class LV {
    static String a = "a";
    static String b = "a";
    static String c = "a";
    static String d = "a";
  }

  class IG {
    // Crazy: comment one of the following 8 lines out and it compiles
    String C1 = "1";
    String C2 = "1";
    String C3 = "1";
    String C4 = "1";
    String C5 = "1";
    String C6 = "1";
    String C7 = "1";
    String C8 = "1";

    static final String C = "c";
    static final String D = C;
    static final String E = C;
    static final String F = C;

    // Crazy: comment one of the following 18 lines out and it compiles
    static final String G = C;
    static final String H = C;
    static final String I = C;
    static final String J = C;
    static final String K = C;
    static final String L = C;
    static final String M = C;
    static final String N = C;
    static final String O = C;
    static final String P = C;
    static final String Q = C;
    static final String R = C;
    static final String S = C;
    static final String T = C;
    static final String U = C;
    static final String V = C;
    static final String W = C;
    static final String X = C;
  }
}
